/*
Date:20210530 21:12PM
key:经典dp
1.学会镜像映射，将全部坐标映射到第二象限。
2.dp[i][j]=dp[i-1][j-2]+dp[i-2][j-1]
3.A的马一步就能走到的八个位置是不能碰的，即这个位置的dp[i][j]=0
4.A的马有可能挡住B走日时走直线部分，故当i-1,j-1与A的马坐标重合时，dp[i][j]=0。
*/
#include <iostream>
#include <vector>
#include<unordered_set>
#include<set>
using namespace std;
bool att(int& i, int& j, int& x, int& y)
{
	if (i + 1 == x && j + 2 == y) { return 1; }
	if (i + 2 == x && j + 1 == y) { return 1; }
	if (i - 1 == x && j - 2 == y) { return 1; }
	if (i - 2 == x && j - 1 == y) { return 1; }
	if (i + 1 == x && j - 2 == y) { return 1; }
	if (i + 2 == x && j - 1 == y) { return 1; }
	if (i - 1 == x && j + 2 == y) { return 1; }
	if (i - 2 == x && j + 1 == y) { return 1; }
	return 0;
}
int main()
{
	int x1, y1, x2, y2;
	cin >> x1 >> y1 >> x2 >> y2;
	int n = max(y1,y2);
	int m = max(x1, x2);
	//从0开始的
	n++; m++;
	int** mat = new int* [n];
	for (int i = 0; i < n; i++)
	{
		mat[i] = new int [m];
	}
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			mat[i][j] = 0;
		}
	}
	
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			if (i == 0 && j == 0) { mat[0][0] = 1; continue; }
			//如果i,j恰好是y1,x1攻击范围的点上
			if(att(i,j,y1,x1)){mat[i][j] = 0;continue;}
			if ((i - 1 == y1) && (j - 1 == x1))
			{
				mat[i][j] = 0;
			}
			else {
				if (i - 2 > -1 && j - 2 > -1)
				{
					mat[i][j] = mat[i - 1][j - 2] + mat[i - 2][j - 1];
				}
				else
				{
					if ((i - 2 > -1 && j - 1 > -1))
					{
						mat[i][j] = mat[i - 2][j - 1];
						continue;
					}
					if ((i - 1 > -1 && j - 2 > -1))
					{
						mat[i][j] = mat[i - 1][j - 2];
					}
					else { mat[i][j] = 0; }
				}
			}
		}
	}
	//for (int i = 0; i < n; i++)
	//{
	//	for (int j = 0; j < m; j++)
	//	{
	//		cout<<mat[i][j]<<"\t";
	//	}
	//	cout << "\n";
	//}
	cout << mat[y2][x2] ;
}